import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.List;

public class Utils {
    static LocalDateTime strToDateTime(String str) {
// 定义格式化器（支持纳秒和时区）
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .appendPattern("yyyy-MM-dd HH:mm:ss")
                .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true)  // 处理纳秒
                .appendPattern(" XX")  // 时区（+0800）
                .toFormatter();
// 转换为LocalDateTime（自动忽略时区信息）
        LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
        return dateTime;
    }

    static void updateFile(String conputerFolder, String tempFolder, List<String> fileANames, List<String> fileBNames, List<LocalDateTime> dates) throws InterruptedException {
        LocalDateTime date1 = dates.get(0);
        LocalDateTime date2 = dates.get(1);
        LocalDateTime date3 = dates.get(2);
        Path folderA = Paths.get(conputerFolder);
        Path folderB = Paths.get(tempFolder);
        while (true) {
            Boolean isExist = pathExist(tempFolder);

            if (!isExist) {
                Thread.sleep(1000);
            }else {
                break;
            }
        }
        // 处理第一对文件
        processFilePair(folderA.resolve(fileANames.get(0)), folderB.resolve(fileBNames.get(0)), date1);
        // 处理第二对文件
        processFilePair(folderA.resolve(fileANames.get(1)), folderB.resolve(fileBNames.get(1)), date2);
        // 处理第三对文件
        processFilePair(folderA.resolve(fileANames.get(2)), folderB.resolve(fileBNames.get(2)), date3);
    }

    private static void processFilePair(Path fileA, Path fileB, LocalDateTime folderBFileDate) {
        try {
            // 获取文件A的最后修改时间
            LocalDateTime fileADate = Files.getLastModifiedTime(fileA)
                    .toInstant()
                    .atZone(ZoneId.systemDefault())
                    .toLocalDateTime();
            // 比较文件A的修改时间和给定的folderB文件日期
            if (fileADate.isAfter(folderBFileDate)) {
                // 文件A较新，用它替换文件B
                replaceFile(fileA, fileB);
                System.out.println(fileA.getFileName() + " 较新，已替换 " + fileB.getFileName());
            } else {
                // 文件B较新，用它替换文件A
                replaceFile(fileB, fileA);
                System.out.println(fileB.getFileName() + " 较新，已替换 " + fileA.getFileName());
            }
        } catch (IOException e) {
            System.err.println("处理文件时出错: " + e.getMessage());
        }
    }

    private static void replaceFile(Path source, Path target) throws IOException {
        // 读取源文件内容
        byte[] content = Files.readAllBytes(source);
        // 写入目标文件（这会覆盖原有内容）
        Files.write(target, content, StandardOpenOption.TRUNCATE_EXISTING);
    }

    public static void deleteByPath(String path) {
        File file = new File(path);
        // 如果路径不存在直接返回
        if (!file.exists()) {
            return;
        }
        // 如果是文件夹，先删除里面的内容
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null) {
                for (File subFile : files) {
                    deleteByPath(subFile.getPath()); // 递归删除
                }
            }
        }
        // 最后删除文件或空文件夹
        file.delete();
    }

    static Boolean pathExist(String path) {
        // 创建一个File对象，表示要检测的文件路径
        File file = new File(path);
        // 调用exists()方法，判断文件是否存在
        boolean exists = file.exists();
        // 输出结果
        return exists;
    }
}
